import axios from 'axios'
import router from '@/router/index.js'
// import { Message } from 'element-ui'
import {errorMessage} from '@/utils/message.js'
import qs from 'qs'
// import store from '@/store'

import { getToken, removeUser } from '@/utils/auth'

const service = axios.create({
  baseURL: process.env.BASE_API, // api的base_url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 20000, // request timeout
  paramsSerializer: params => {
    return qs.stringify(params, { indices: false })
  }
})

const handleErrorResponse = (error) => {
  let response = error.response
  let config = error.config
  if (error && error.stack.indexOf('timeout') !== -1) {
    return errorMessage('请求超时')
  }
  if (response) {
    switch (response.status) {
      case 401: // 未登录或过期，跳至登录页
        if (router.currentRoute.path !== '/login') {
          removeUser()
          router.replace({ path: '/login', query: { redirect: router.currentRoute.fullPath } })
        }
        break
      case 413: // Request Too Large
        errorMessage('请求内容超出服务器限制: 输入的数据过多或上传文件内容过大.')
        break
      case 403:
        errorMessage('服务器拒绝提供服务')
        break
      default:
        if (config && config.silent === true) break
        if (response.data && response.data.msg) {
          errorMessage(response.data.msg)
        } else {
          errorMessage('服务器发生 ' + response.status + ' 错误.')
        }
        break
    }
  } else if (!config || config.silent !== true) {
    errorMessage('服务器连接失败')
  }
}

// request拦截器
service.interceptors.request.use(config => {
    // 发送请求前，在这里添加上token
    if (getToken()) {
    // 让每个请求携带token--['X-Token']为自定义key 请根据实际情况自行修改
      config.headers['Authorization'] = getToken()
    }
    // 这里主要是避免mock出错
    if (!config.data) {
      config.data = {}
    }
    // if (process.env.NODE_ENV === 'development') {
      // 根据接口不同请求不同后台服务
      // if (config.url.substr(0, config.url.indexOf('/')) === 'pf') {
      //   config.baseURL = process.env.Plat_API
      // } else if (config.url.substr(0, config.url.indexOf('/')) === 'restapi' || config.url.substr(0, config.url.indexOf('/')) === 'fastdfs' || config.url.substr(0, config.url.indexOf('/')) === 'tw' || config.url.indexOf('login') > -1) {
      //   config.baseURL = process.env.PAGE_API
      // } else if (config.url.substr(0, config.url.indexOf('/')) === 'oauth') {
      //   config.baseURL = process.env.AUTH_API
      // }
    // }
    return config
  },
  error => {
    // 请求失败的时候记录日志等处理
    console.log(error) // 用于调试
    Promise.reject(error) // 通知失败了
  }
)

// http response 拦截器
service.interceptors.response.use(
  response => {
    // 文件下载
    if (response.headers !== undefined && response.headers !== null && response.request.responseType === 'blob') {
      return response
    }
    let responseData = response.data
    // TODO 先对http协议的一些非200的响应代码进行处理
    if (responseData.code !== '0') {
      // TODO 兼容后端可能存在的bug，进行容错处理
      if (responseData.code === '401') {
        // TODO 这里应该报错，并跳转到登录界面去
      }
      if (responseData.code === '403') {
        // TODO 报错，跳转到登录界面
      }
      if (responseData.code === '500') {
      }
    }

    // responseData.success = responseData.errcode === '0'
    // responseData.success = responseData.code === '0' || responseData.code === 0
    // console.log('responseData.success', responseData.success)
    // if (!responseData.success) {
    //   Message({
    //     message: responseData.message,
    //     type: 'error',
    //     duration: 3 * 1000
    //   })
    //   // msg(responseData)
    //   return Promise.reject(responseData)
    // }
    return responseData
  },
  error => {
    handleErrorResponse(error)
    return Promise.reject(error) // 返回接口返回的错误信息
  }
)

export default service
